const fs = require("fs");
const path = require("path");
const url = require("url");

// 扩展Res
let changeRes = (res) => {
  res.send = (data) => {
    res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'});
    res.end(data);
  }
}

// 根据后缀名获取文件类型
const getFileMineSync = (extname) => {
  let data = fs.readFileSync("./data/mime.json"); // 同步方法
  let mineObj = JSON.parse(data.toString());
  return mineObj[extname]
}

// 初始化静态web目录
const initStatic = (req, res, staticPath) => {
  // 1. 获取地址
  let pathname = url.parse(req.url).pathname;
  pathname = pathname == '/' ? '/index.html' : pathname;
  let extname = path.extname(pathname); // 获取后缀名
  // 2. 通过 fs 模块读取文件
  try {
    let data = fs.readFileSync('./' + staticPath + pathname);
    if (data) {
      const responseHeader = getFileMineSync(extname);
      res.writeHead(200, { 'Content-Type': `${responseHeader};charset='utf-8'` });
      res.end(data);
    }
  } catch (error) {}
}

let server = () => {

  // 把get和post分开
  let G = {
    _get: {},
    _post: {},
    staticPath: "static"  // 默认静态web目录
  };

  let app = function(req, res) {

    // 扩展res的方法
    changeRes(res);

    // 注册静态方法
    initStatic(req, res, G.staticPath);

    let pathname = url.parse(req.url).pathname;
    console.log(`pathname`, pathname);
    // 获取请求类型
    let method = req.method.toLowerCase();
    console.log(`method`, method);

    if(G["_"+method][pathname]) {
      if(method === "get") {
        G["_"+method][pathname](req, res); // 执行方法
      } else {
        // 获取 post 的数据，把它绑到 req.body
        let postData = "";
        req.on("data", (chunk) => {
          postData += chunk;
        })
        req.on("end", () => {
          console.log("postData", postData);
          req.body = postData
          G["_"+method][pathname](req, res); // 执行方法
        })
      }
    } else {
      res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
      res.end("页面不存在");
    }
  }

  // 配置GET请求
  app.get = function(str, cb) {
    // 注册方法
    G._get[str] = cb;
  }

  // 配置POST请求
  app.post = function(str, cb) {
    // 注册方法
    G._post[str] = cb;
  }

  // 配置静态web服务目录
  app.static = function(staticPath) {
    G.staticPath = staticPath;
  }

  return app;
}

// 暴露实例化对象
module.exports = server();